package eu.floranet.arquivo.temp;

import java.io.IOException;
import java.util.InvalidPropertiesFormatException;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * Classe de construção da <code>Persistence.createEntityManagerFactory</code>.
 * Esta classe implementa a ligação á base de dados.
 * 
 * @author jmark
 * 
 */
public class EclipseLink {

	protected EntityManagerFactory emf;
	protected EntityManager em;
	private EclipseLinkProperties linkProp;

	/**
	 * Método de construção da base de dados. Este construtor chama
	 * imediatamente o método <code> checkProperties()</code> para verificar se
	 * o o mapa de parametros não está vazio e se o ficheiro de configuração
	 * existe.
	 */
	public EclipseLink() {
		super();
		checkProperties();
	}

	/**
	 * Método de verificação de mapa de parametros e ficheiro de configuração.
	 * 
	 * @return boolean
	 */
	public boolean checkProperties() {
		this.linkProp = new EclipseLinkProperties();
		try {
			if ((!this.linkProp.getProperties().isEmpty())
					&& (this.linkProp.existPropertiesFile())) {
				return true;
			} else {
				return false;
			}
		} catch (InvalidPropertiesFormatException e) {
			return false;
		} catch (IOException e) {
			return false;
		}
	}

	/**
	 * Método de iniciação de comunicação com a base de dados.
	 * 
	 * @throws InvalidPropertiesFormatException
	 * @throws IOException
	 */
	public void initEntityManager() throws EclipseLinkException {
		try {
			this.emf = Persistence.createEntityManagerFactory(
					"ModelArqDiocese", this.linkProp.getProperties());
			this.em = this.emf.createEntityManager();
		} catch (InvalidPropertiesFormatException e) {
			throw new EclipseLinkException(e.getMessage(), e.getCause());
		} catch (IOException e) {
			throw new EclipseLinkException(e.getMessage(), e.getCause());
		}
	}

	/**
	 * Método que fecha o link á base de dados.
	 */
	public void cleanUpClosedEMF() {
		if (this.emf != null && !this.emf.isOpen()) {
			this.emf = null;
		} else if (this.emf != null && this.emf.isOpen()) {
			this.emf.close();
			this.emf = null;
		}
	}

}
